package com.zhx.common.chat.service.impl;

import com.zhx.common.chat.dao.ContactDao;
import com.zhx.common.chat.domain.dto.MsgReadInfoDTO;
import com.zhx.common.chat.domain.entity.Message;
import com.zhx.common.chat.service.IContactService;
import com.zhx.common.common.util.AssertUtil;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;

@Service
public class ContactServiceImpl implements IContactService {

    @Resource
    private ContactDao contactDao;
    /**
     * 获取消息的阅读信息。
     *
     * @param messages 消息列表，这些消息应该是同房间内的消息。
     * @return 返回一个映射，键是消息ID，值是对应消息的阅读信息DTO（包括消息ID、已读数量、未读数量）。
     */
    @Override
    public Map<Long, MsgReadInfoDTO> getMsgReadInfo(List<Message> messages) {
        // 根据消息的房间ID进行分组
        Map<Long, List<Message>> roomGroup = messages.stream().collect(Collectors.groupingBy(Message::getRoomId));

        // 确保所有消息属于同一个房间，否则抛出异常
        AssertUtil.equal(roomGroup.size(), 1, "只能查相同房间下的消息");

        // 获取房间ID
        Long roomId = roomGroup.keySet().iterator().next();

        // 获取该房间下的用户总数
        Integer totalCount = contactDao.getTotalCount(roomId);

        // 对每条消息生成阅读信息DTO，并收集到映射中
        return messages.stream().map(message -> {
            MsgReadInfoDTO readInfoDTO = new MsgReadInfoDTO();
            readInfoDTO.setMsgId(message.getId());
            // 获取该消息已被阅读的数量
            Integer readCount = contactDao.getReadCount(message);
            readInfoDTO.setReadCount(readCount);
            // 计算未读数量（总数量 - 已读数量 - 1，减1是因为当前消息本身不计算在内）
            readInfoDTO.setUnReadCount(totalCount - readCount - 1);
            return readInfoDTO;
        }).collect(Collectors.toMap(MsgReadInfoDTO::getMsgId, Function.identity()));
    }

}
